aliases:
  # Cache management
  - &restore_yarn_cache
    restore_cache:
      keys:
        - v1-yarn-cache

  - &save_yarn_cache
    save_cache:
      paths:
        - ~/.cache/yarn
      key: v1-yarn-cache

  - &restore_deps_cache
    restore_cache:
      keys:
        - v1-deps-cache-{{ checksum "yarn.lock" }}

  - &save_deps_cache
    save_cache:
      paths:
        - node_modules
      key: v1-yarn-deps-{{ checksum "yarn.lock" }}

  # Default
  - &defaults
    working_directory: ~/prettier
    docker:
      - image: circleci/node:9

version: 2
jobs:
  # Install dependencies and cache everything
  checkout_code:
    <<: *defaults
    steps:
      - checkout
      - *restore_yarn_cache
      - *restore_deps_cache
      - run: yarn install
      - run: yarn check-deps
      - *save_deps_cache
      - *save_yarn_cache
      - persist_to_workspace:
          root: .
          paths:
            - .

  # Create the production bundle and cache
  build_prod:
    <<: *defaults
    environment:
      NODE_ENV: production
    steps:
      - attach_workspace:
          at: ~/prettier
      - run: yarn build
      - persist_to_workspace:
          root: .
          paths:
            - dist
      - store_artifacts:
          path: ~/prettier/dist

  # Run tests on the production bundle
  test_prod_node4:
    <<: *defaults
    docker:
      - image: circleci/node:4
    steps:
      - attach_workspace:
          at: ~/prettier
      - run: yarn test:dist

  # Run tests on the production bundle
  test_prod_node9:
    <<: *defaults
    steps:
      - attach_workspace:
          at: ~/prettier
      - run: yarn test:dist

workflows:
  version: 2
  prod:
    jobs:
      - checkout_code
      - build_prod:
          requires:
            - checkout_code
      - test_prod_node4:
          requires:
            - build_prod
      - test_prod_node9:
          requires:
            - build_prod
